package page;

import org.openqa.selenium.By;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

/**
 * 各类Page Object的基础类，封装通用的功能
 */
public class BasePage {

    public static WebDriver driver;
    //TODO：重试次数
    Integer retryTimes = 3;

    /**
     * 构造函数
     */
    public BasePage(WebDriver driver) {
        this.driver = driver;
    }

    /**
     * 封装Click方法
     *
     * @param by By对象
     * @return 结果可以忽略
     */
    public boolean click(By by) {
        //todo: 突然的弹框阻挡、异常处理、流程调整
        //todo: find找不到 弹框阻挡 加载延迟
        //todo: click的时候报错
        //todo: click的时候不生效
        //todo: click的时候被弹框阻挡

        // ==== debug start ======
        System.out.println("===DEBUG信息===   click By：[" + by.toString() + "]");
        // ==== debug end ======

        try {
            driver.findElement(by).click();
        } catch (Exception e) {
            e.printStackTrace();
            retryTimes += 1;
            if (retryTimes < 4) {
                //todo: 解决弹框
                this.handleAlert();
                return click(by);
            } else {
                retryTimes = 0;
                return false;
            }
        }
        return true;
    }

    /**
     * @param by   By对象
     * @param next 要等待的对象
     */
    public void clickUntil(By by, By next) {
        //TODO: 用来解决前几次点击不生效，后面点击生效的过程，使用显式等待
    }

    /**
     * 封装sendKeys方法
     *
     * @param by      By对象
     * @param content 要输入的内容
     */
    public void sendKeys(By by, String content) {
        driver.findElement(by).sendKeys(content);
    }

    /**
     * 处理各类弹出
     */
    public void handleAlert() {
        //TODO：解决弹窗的具体实现
    }

    /**
     * 判断元素可见
     *
     * @param by   定位
     * @param time 超时时间，单位：秒
     * @return
     */
    public Boolean isVisiable(By by, int time) {
        boolean result = false;
        try {
            WebDriverWait wait = new WebDriverWait(driver, time);
            wait.until(ExpectedConditions.visibilityOf(driver.findElement(by)));
            result = true;
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("===DEBUG信息===   isVisiable查找元素异常，元素为：[" + by.toString() + "]");
        } finally {
            return result;
        }
    }
}
